#include<iostream>
#include<assert.h>
using namespace std;

class Stack
{
public:
	Stack()
	{
		cout << "Stack()" << endl;
		_a = nullptr;
		_size = _capacity = 0;
	}
	Stack(int n)
	{
		_a = (int*)malloc(sizeof(int) * n);
		if (nullptr == _a)
		{
			perror("malloc申请空间失败");
			return;
		}
		_capacity = n;
		_size = 0;
	}

	void Push(int x)
	{
		_a[_size++] = x;
	}

	bool Empty()
	{
		return _size = 0;
	}

	int Top()
	{
		return _a[_size - 1];
	}

	~Stack()
	{
		cout << "~Stack()" << endl;
		free(_a);
		_a = nullptr;
		_size = _capacity = 0;
	}
private:
	//成员变量
	int* _a;
	int _size;
	int _capacity;
};
//
//int main()
//{
//	//Stack st;
//	Stack st(4);
//
//	st.Push(1);
//	st.Push(2);
//	st.Push(3);
//	st.Push(4);
//
//	//st.Destroy();
//
//	return 0;
//}

//class Date
//{
//public:
//	//Date()
//	//{
//	//	_year = 1;
//	//	_month = 1;
//	//	_day = 1;
//	//}
//	//Date(int year, int month, int day)
//	//{
//	//	_year = year;
//	//	_month = month;
//	//	_day = day;
//	//}
//	Date(int year=1, int month=1, int day=1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	void Print()
//	{
//		cout << _year << "/" << _month << "/" << _day << endl;
//		cout << _year << "年" << _month << "月" << _day <<"日" << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Date d1;
//	Date d2(2024, 4, 13);
//	Date d3(2023, 4);
//	
//	d1.Print();
//	d2.Print();
//	d3.Print();
//
//
//	return 0;
//}

//class Date
//{
//public:
//	//默认生成的构造函数，对内置类型不做处理
//	void Print()
//	{
//		//cout << _year << "/" << _month << "/" << _day << endl;
//		cout << _year << "年" << _month << "月" << _day << "日" << endl;
//	}
//private:
//	//基本类型/内置类型
//	int _year;
//	int _month;
//	int _day;
//};
//
//class MyQueue {
//public:
//	//默认生成的构造函数，对自定义类型，会调用它的默认构造函数
//	//默认生成的析构函数，对自定义类型，会调用它的析构函数
//	void push(int x)
//	{
//
//	}
//	Stack _pushST;
//	Stack _popST;
//};
//int main()
//{
//	//Date d1;
//	//d1.Print();
//
//	MyQueue q;
//	return 0;
//}


class Date
{
public:
	Date(int year = 1000, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	
	//拷贝构造
	//Date d2(d1)
	Date(const Date& d)
	{
		cout << "Date(Date&d)" << endl;

		_year = d._year;
		_month = d._month;
		_day = d._day;

	}

	int GetMonthDay(int year, int month)
	{
		assert(month > 0 && month < 13);

		int monthArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		if(month==2&&((year%4==0&&year%100!=0)||(year%400)==0))
		{
			return 29;
		}
		else
		{
			return monthArray[month];
		}
	}
	//+
	Date Add(int x)
	{
		Date tmp = *this;
		tmp._day += x;
		while (tmp._day > GetMonthDay(tmp._year, tmp._month))
		{
			//进位
			tmp._day -= GetMonthDay(tmp._year, tmp._month);
			++tmp._month;
			if (tmp._month == 13)
			{
				tmp._year++;
				tmp._month = 1;
			}
		}
		return tmp;
	}

	//+=
	Date& AddEuqual(int x)
	{
		_day += x;
		while (_day > GetMonthDay(_year, _month))
		{
			//进位
			_day -= GetMonthDay(_year, _month);
			++_month;
			if (_month == 13)
			{
				++_year;
				_month = 1;
			}

		}
		return *this;
	}

	void Print()
	{
		cout << _year << "年" << _month << "月" << _day << "日" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2024, 4, 13);
	Date d2 = d1.Add(100);
	Date d3 = d1.AddEuqual(150);

	d1.Print();
	d2.Print();
	d3.Print();

	d1.AddEuqual(100);

	d1.Print();

	//实现一个函数，获取多少天以后的一个日期
	return 0;
}
